package cn.bonoon.kernel.web.views;
//package cn.bonoon.kernel.support.views;
//
//import java.text.SimpleDateFormat;
//import java.util.Collections;
//import java.util.Date;
//import java.util.List;
//import java.util.Locale;
//import java.util.Map;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
//import org.apache.poi.hssf.usermodel.HSSFCell;
//import org.apache.poi.hssf.usermodel.HSSFCellStyle;
//import org.apache.poi.hssf.usermodel.HSSFFont;
//import org.apache.poi.hssf.usermodel.HSSFRow;
//import org.apache.poi.hssf.usermodel.HSSFSheet;
//import org.apache.poi.hssf.usermodel.HSSFWorkbook;
//import org.apache.poi.ss.util.CellRangeAddress;
//import org.springframework.beans.BeanWrapperImpl;
//import org.springframework.web.servlet.support.RequestContextUtils;
//import org.springframework.web.servlet.view.document.AbstractExcelView;
//
//import cn.bonoon.kernel.util.StringHelper;
//
//public class ExportExcelView extends AbstractExcelView {
//
//	public static final String DEFAULT_DATA_KEY = "datas";
//	public static final int DEFAULT_SHEET_INDEX = 0;
//
//	private String dataKey = DEFAULT_DATA_KEY;
//
//	private ExcelEntry excelEntry;
//
//	private ExcelEntry excelEntry() {
//		if (null == excelEntry)
//			excelEntry = ExcelEntry.EMPTY;
//		return excelEntry;
//	}
//
//	private BeanWrapperImpl wrapper;
//
//	@Override
//	protected void buildExcelDocument(Map<String, Object> model,
//			HSSFWorkbook workbook, HttpServletRequest request,
//			HttpServletResponse response) throws Exception {
//		Object obj = model.get(getDataKey());
//		if (null == obj)
//			throw new NullPointerException("没有绑定的数据");
//
//		if (obj instanceof MultiSheet) {
//			MultiSheet ms = (MultiSheet) obj;
//			for (int i = 0, len = ms.size(); i < len; i++) {
//				List<?> ls = ms.get(i);
//				buildDocument(workbook, i, ls, request);
//			}
//			return;
//		}
//
//		List<?> ls = (obj instanceof List) ? (List<?>) obj : Collections
//				.singletonList(obj);
//
//		buildDocument(workbook, DEFAULT_SHEET_INDEX, ls, request);
//	}
//
//	private BeanWrapperImpl wrapper() {
//		if (null == wrapper)
//			wrapper = new BeanWrapperImpl();
//		return wrapper;
//	}
//
//	private void buildCell(HSSFSheet sheet, HSSFCellStyle style, int skip,
//			String str, int size) {
//		HSSFRow subtitleRow = sheet.createRow(skip);
//		HSSFCell cell = subtitleRow.createCell(0);
//		if (null != style)
//			cell.setCellStyle(style);
//		setText(cell, str);
//		CellRangeAddress cra = new CellRangeAddress(skip, skip, 0, size);
//		sheet.addMergedRegion(cra);// 指定合并区域
//	}
//
//	/**
//	 * 设置样式
//	 * 
//	 * @param workbook
//	 * @param ecs
//	 * @return
//	 */
//	protected HSSFCellStyle setStyle(HSSFWorkbook workbook, ExcelCellStyle ecs) {
//		if (null == ecs)
//			return null;
//		HSSFCellStyle style = workbook.createCellStyle();
//		// 设置这些样式
//		style.setFillForegroundColor(ecs.getFillForegroundColor());
//		style.setAlignment(ecs.getAlignment());
//		// 生成一个字体
//		HSSFFont font = workbook.createFont();
//		font.setColor(ecs.getColor());
//		font.setFontHeightInPoints(ecs.getFontSize());
//		font.setBoldweight(ecs.getBoldweight());
//		// 把字体应用到当前的样式
//		style.setFont(font);
//		return style;
//	}
//
//	private void setText(HSSFCell cell, String text, HSSFWorkbook workbook,
//			ExcelCellStyle ecs) {
//		HSSFCellStyle style = setStyle(workbook, ecs);
//		if (null != style)
//			cell.setCellStyle(style);
//		setText(cell, text);
//	}
//
//	private void buildDocument(HSSFWorkbook workbook, int sheetIndex,
//			List<?> ls, HttpServletRequest request) {
//		if (null == ls || ls.isEmpty())
//			return;
//		// 处理sheet的头部
//		ExcelEntry xls = excelEntry();
//		SheetEntry se = xls.getSheet(sheetIndex);
//		// 这里有个逻辑问题
//		while (workbook.getNumberOfSheets() < sheetIndex) {
//			workbook.createSheet();
//		}
//		if (null != se.getSheetName())
//			workbook.setSheetName(sheetIndex, se.getSheetName());
//
//		HSSFSheet sheet = workbook.getSheetAt(sheetIndex);
//		int skip = se.getStartRow();
//		List<ExcelColumn> ecs = se.getColumns();
//		boolean hasOrdinal = se.isOrdinal();
//		int cellSize = ecs.size();
//		int rSize = hasOrdinal ? cellSize + 1 : cellSize;
//		// 台头,标题之类
//		String title = se.getTitle();
//		if (StringHelper.isNotEmpty(title)) {
//			HSSFCellStyle style = setStyle(workbook, se.getTitleStyle());
//			buildCell(sheet, style, skip++, title, rSize);
//		}
//
//		// 副标题之类
//		String subtitle = se.getSubtitle();
//		if (StringHelper.isNotEmpty(subtitle)) {
//			HSSFCellStyle style = setStyle(workbook, se.getSubtitleStyle());
//			buildCell(sheet, style, skip++, subtitle, rSize);
//		}
//
//		// 可能是部门和日期之类的
//		String dept = se.getDept();
//		String date = se.getDate();
//		HSSFRow row3 = null;
//		if (StringHelper.isNotEmpty(dept)) {
//			row3 = sheet.createRow(skip++);
//			setText(row3.createCell(0), dept, workbook, se.getDeptStyle());
//		}
//		if (StringHelper.isNotEmpty(date)) {
//			if (row3 == null)
//				row3 = sheet.createRow(skip++);
//			int last = Math.max(1, rSize);
//			setText(row3.createCell(last), date, workbook, se.getDateStyle());
//		}
//
//		// 列表头
//		HSSFRow headRow = sheet.createRow(skip++);
//		int O = 0;
//		if (hasOrdinal)// 序号
//			setText(headRow.createCell(O++), se.getOrdinalName());
//
//		for (int i = 0; i < cellSize; i++, O++) {
//			setText(headRow.createCell(O), ecs.get(i).getTitle());
//		}
//
//		Locale locale = RequestContextUtils.getLocale(request);
//		for (int i = 0, len = ls.size(); i < len; i++) {
//			Object obj = ls.get(i);
//			HSSFRow row = sheet.createRow(skip++);
//			O = 0;
//			if (hasOrdinal) {
//				HSSFCell cell = row.createCell(O++);
//				cell.setCellValue(i + 1);
//			}
//			if (null == obj)
//				continue;
//
//			if (obj instanceof Iterable) {
//				buildRow((Iterable<?>) obj, ecs, O, row, locale);
//			} else if (obj.getClass().isArray()) {
//				buildRow((Object[]) obj, ecs, O, row, locale);
//			} else {
//				buildRow(obj, ecs, O, row, locale);
//			}
//		}
//
//		// 处理使用表示式
//		O = hasOrdinal ? 1 : 0;
//		HSSFRow footRow = null;
//		for (int i = 0; i < cellSize; i++, O++) {
//			ExcelColumn ec = ecs.get(i);
//			String formula = ec.getFootFormula();
//			if (StringHelper.isNotEmpty(formula)) {
//				if (null == footRow)
//					footRow = sheet.createRow(skip++);
//				HSSFCell cell = footRow.createCell(O);
//				cell.setCellFormula(formula);
//			}
//		}
//
//		// 脚
//		String footer = se.getFooter();
//		if (StringHelper.isNotEmpty(footer)) {
//			int ri = skip + se.getFootSkip();
//			HSSFRow fw = sheet.createRow(ri);
//			HSSFCell cell = fw.createCell(0);
//			setText(cell, footer, workbook, se.getFooterStyle());
//		}
//	}
//
//	private void buildRow(Iterable<?> iter, List<ExcelColumn> ecs, int O,
//			HSSFRow row, Locale locale) {
//		int i = 0;
//		for (Object vo : iter) {
//			buildCell(vo, ecs, i++, O++, row, locale);
//		}
//		appendFormula(ecs, i, O, row);
//	}
//
//	private void buildRow(Object[] objs, List<ExcelColumn> ecs, int O,
//			HSSFRow row, Locale locale) {
//		int i = 0;
//		for (; i < objs.length; i++, O++) {
//			buildCell(objs[i], ecs, i, O, row, locale);
//		}
//		appendFormula(ecs, i, O, row);
//	}
//
//	private void buildCell(Object vo, List<ExcelColumn> ecs, int i, int O,
//			HSSFRow row, Locale locale) {
//		ExcelColumn ec = null;
//		if (null != ecs && ecs.size() > i) 
//			ec = ecs.get(i);
//		
//		buildCell(vo, row, O, ec, locale);
//	}
//
//	private void appendFormula(List<ExcelColumn> ecs, int i, int O, HSSFRow row) {
//		// 如果后面还追加有表达式,则需要处理表达式
//		if (null != ecs) {
//			for (; i < ecs.size(); i++, O++) {
//				setFormula(ecs.get(i), O, row);
//			}
//		}
//	}
//
//	private void buildRow(Object obj, List<ExcelColumn> ecs, int O,
//			HSSFRow row, Locale locale) {
//		wrapper().setWrappedInstance(obj);
//		for (int j = 0, lenj = ecs.size(); j < lenj; j++, O++) {
//			ExcelColumn ec = ecs.get(j);
//			if (ec.isFormula()) {
//				HSSFCell cell = row.createCell(O);
//				cell.setCellFormula(ec.getFormula());
//			} else {
//				Object vo = wrapper().getPropertyValue(ec.getProperty());
//				buildCell(vo, row, O, ec, locale);
//			}
//		}
//	}
//
//	private void setFormula(ExcelColumn ec, int O, HSSFRow row) {
//		if (ec.isFormula()) {
//			HSSFCell cell = row.createCell(O);
//			cell.setCellFormula(ec.getFormula());
//		}
//	}
//
//	private void buildCell(Object vo, HSSFRow row, int O, ExcelColumn ec,
//			Locale locale) {
//		if (null == vo)
//			return;
//
//		HSSFCell cell = row.createCell(O);
//		String vl = StringHelper.Empty;// ec.getValue(obj);
//		// 比较常见的格式有,string, number, date
//		if (vo instanceof String) {//
//			vl = (String) vo;
//		} else if (vo instanceof Number) {
//			double d = ((Number) vo).doubleValue();
//			cell.setCellValue(d);
//			return;
//		} else if (vo instanceof Date) {
//			Date date = (Date) vo;
//			if (null != ec) {
//				vl = ec.formatDate(date, locale);
//			} else {
//				vl = new SimpleDateFormat(StringHelper.DEFAULT_DATETIME_FORMAT,
//						locale).format(date);
//			}
//		} else if (vo instanceof Boolean) {
//			cell.setCellValue((Boolean) vo);
//			return;
//		} else {
//			vl = vo.toString();
//		}
//		setText(cell, vl);
//	}
//
//	public void setDataKey(String dataKey) {
//		this.dataKey = dataKey;
//	}
//
//	public String getDataKey() {
//		return dataKey;
//	}
//
//	public void setExcelEntry(ExcelEntry excelEntry) {
//		this.excelEntry = excelEntry;
//		String url = excelEntry.getUrl();
//		if (null != url)
//			setUrl(url);
//	}
//
//	public ExcelEntry getExcelEntry() {
//		return excelEntry;
//	}
//
//}
